package net.xdclass.controller;

import lombok.extern.slf4j.Slf4j;
import net.xdclass.annotation.RepeatSubmit;
import net.xdclass.constant.RedisKey;
import net.xdclass.controller.request.ConfirmOrderRequest;
import net.xdclass.controller.request.ProductOrderPageRequest;
import net.xdclass.enums.BizCodeEnum;
import net.xdclass.enums.ClientTypeEnum;
import net.xdclass.enums.ProductOrderPayTypeEnum;
import net.xdclass.interceptor.LoginInterceptor;
import net.xdclass.service.ProductOrderService;
import net.xdclass.util.CommonUtil;
import net.xdclass.util.JsonData;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.ThreadUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 功能描述
 *
 * @author ASUS
 * @date 2024/09/01  10:09
 */
@RestController
@RequestMapping("api/order/v1")
@Slf4j
public class ProductOrderController {
    @Autowired
    private ProductOrderService productOrderService;
    @Autowired
    private StringRedisTemplate redisTemplate;

    @PostMapping("page")
//    @RepeatSubmit(limitType = RepeatSubmit.Type.PARAM)
    public JsonData page(
//            @RequestParam(value = "page",defaultValue = "1") int page,
//            @RequestParam (value = "size",defaultValue = "10")int size,
//            @RequestParam(value = "state",required = false) String state
            @RequestBody ProductOrderPageRequest request
            ){
        Map<String,Object> pageInfo = productOrderService.page(request);
        return JsonData.buildSuccess(pageInfo);
    }

    /**
     * 查询订单状态
     * @param outTradeNo
     * @return
     */
    @GetMapping("query_state")
    public JsonData queryState(@RequestParam(value = "out_trade_no")String outTradeNo ){
        String state = productOrderService.queryState(outTradeNo);
        return StringUtils.isBlank(state) ? JsonData.buildResult(BizCodeEnum.ORDER_CONFIRM_NOT_EXIST) : JsonData.buildSuccess(state);
    }

    /**
     * 下单接口
     * @param orderRequest
     * @param response
     */
    @PostMapping("confirm")
    //@RepeatSubmit(limitType = RepeatSubmit.Type.TOKEN)
    public JsonData confirmOrder(@RequestBody ConfirmOrderRequest orderRequest, HttpServletResponse response){
        JsonData jsonData = productOrderService.confirmOrder(orderRequest);
        return jsonData;
//        //端类型
//        String clientType = orderRequest.getClientType();
//        //支付类型
//        String payType = orderRequest.getPayType();
//        if(jsonData.getCode()==0){
//            //创建订单成功
//            //如果是支付宝支付，跳转网页
//            if(payType.equalsIgnoreCase(ProductOrderPayTypeEnum.ALI_PAY.name())){
//                if(clientType.equalsIgnoreCase(ClientTypeEnum.PC.name())){
//                    CommonUtil.sendHtmlMessage(response,jsonData);
//                }else if (clientType.equalsIgnoreCase(ClientTypeEnum.APP.name())){
//
//                }else if (clientType.equalsIgnoreCase(ClientTypeEnum.H5.name())){
//
//                }
//            }
//
//
//        }else if(payType.equalsIgnoreCase(ProductOrderPayTypeEnum.WECHAT_PAY.name())){
//            CommonUtil.sendJsonMessage(response,jsonData);
//        }
//
//        else{
//            log.error("创建订单失败{}!",jsonData.toString());
//            CommonUtil.sendJsonMessage(response,jsonData);
//        }
    }

    /**
     * 下单前获取令牌，用于防重提交
     * @return
     */
    @GetMapping("token")
    public JsonData getOrderToken(){
        long accountNo = LoginInterceptor.threadLocal.get().getAccountNo();
        String token = CommonUtil.getRandomCode(32);
        String key = String.format(RedisKey.SUBMIT_ORDER_TOKEN_KEY, accountNo, token);
        //令牌有效时间是30分钟
        redisTemplate.opsForValue().set(key, String.valueOf(Thread.currentThread().getId()),30, TimeUnit.MINUTES);
        return JsonData.buildSuccess(token);
    }


}
